#include "mainwindow.h"
#include "ui_mainwindow.h"

#include "NodoArbol.h"

#include "ABB.h"
#include <QMessageBox>
//#include "form.h"
#include "AB.h"
#include "RN.h"


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //AB
    Partes=new AB<B>();
    IFS::ReadPartes(Partes);
    //Arboles
    Indice = new ListaQ<Lista <unsigned int >* >();
    Clientes=new AVL();
    Registros=new Splay();
    Tarjetas=new RN();
    Bancos=new ABB();
    //Lectura de archivos
    IFS::ReadBancos(Bancos);
    IFS::ReadClientes(Clientes);
    IFS::ReadTarjetas(Tarjetas,Bancos,Clientes);
    IFS::ReadRegisto(Registros,Clientes);
    cant=0;
    proc=0;

    ff=false;

    ui->C1->setVisible(false);
    ui->C2->setVisible(false);
    ui->C3->setVisible(false);
    ui->C4->setVisible(false);
    ui->C5->setVisible(false);
    ui->C6->setVisible(false);
    ui->C7->setVisible(false);
    ui->C8->setVisible(false);
    ui->C9->setVisible(false);

    Th1=new StarT();
    Th1->setB(Partes);
    Th1->setRN(Tarjetas);
    Th1->setId(1);
    Th1->setYa(false);

    Th2=new StarT();
    Th2->setB(Partes);
    Th2->setRN(Tarjetas);
    Th2->setId(2);
    Th2->setYa(false);

    Th3=new StarT();
    Th3->setB(Partes);
    Th3->setRN(Tarjetas);
    Th3->setId(3);
    Th3->setYa(false);

    connect(Th1,SIGNAL(Finit(int)),this,SLOT(IFinit(int)));
    connect(Th1,SIGNAL(ImagDes(int)),this,SLOT(ImagDes(int)));
    connect(Th1,SIGNAL(ImagMov(int,int,int)),this,SLOT(ChImag(int,int,int)));
    connect(Th1,SIGNAL(NamCh(int,QString)),this,SLOT(ChNam(int,QString)));
    connect(Th1,SIGNAL(NunCh(int,int)),this,SLOT(ChNum(int,int)));
    connect(Th1,SIGNAL(TarCh(int,QString)),this,SLOT(ChTar(int,QString)));

    connect(Th2,SIGNAL(Finit(int)),this,SLOT(IFinit(int)));
    connect(Th2,SIGNAL(ImagDes(int)),this,SLOT(ImagDes(int)));
    connect(Th2,SIGNAL(ImagMov(int,int,int)),this,SLOT(ChImag(int,int,int)));
    connect(Th2,SIGNAL(NamCh(int,QString)),this,SLOT(ChNam(int,QString)));
    connect(Th2,SIGNAL(NunCh(int,int)),this,SLOT(ChNum(int,int)));
    connect(Th2,SIGNAL(TarCh(int,QString)),this,SLOT(ChTar(int,QString)));

    connect(Th3,SIGNAL(Finit(int)),this,SLOT(IFinit(int)));
    connect(Th3,SIGNAL(ImagDes(int)),this,SLOT(ImagDes(int)));
    connect(Th3,SIGNAL(ImagMov(int,int,int)),this,SLOT(ChImag(int,int,int)));
    connect(Th3,SIGNAL(NamCh(int,QString)),this,SLOT(ChNam(int,QString)));
    connect(Th3,SIGNAL(NunCh(int,int)),this,SLOT(ChNum(int,int)));
    connect(Th3,SIGNAL(TarCh(int,QString)),this,SLOT(ChTar(int,QString)));

    connect(this,SIGNAL(EFinit()),this,SLOT(EIFinit()));

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    QMessageBox Mensaj;
    int* a =0;
    a=(int*)2;
    a=(int*)((int)a+1);
    //bool* b=(bool*)false;

    Splay prueba;
    //prueba.Raiz=new NodoArbol<string>(3,"mooo");
    //prueba.Raiz->setHizq(new NodoArbol<string>(1,"hh"));
    prueba.Insertar(8,1,"hola");
    prueba.Insertar(56,1,"hola");
    prueba.Insertar(21,1,"hola");
    prueba.Insertar(2,1,"hola");

    QString ab = prueba.Preorden();
    prueba.Buscar(56);


    //Mensaj.setText(QString::number(prueba.Revisar());
    Mensaj.setText(ab);
    Mensaj.setWindowTitle("!");
    Mensaj.exec();
}

void MainWindow::on_pushButton_2_clicked()
{
    //Form a;
    //a.sho
    AB<B> pru;
    //Pagina<hola>* holas= new Pagina<hola>();
    B a={5,1,"hola","holai"},b={6,7,"1hola","1holai"},c={8,9,"hola","holai"},d={5,1,"hola","holai"},e={5,1,"hola","holai"};
    pru.Insertar(5,a);
    pru.Insertar(6,b);
    pru.Insertar(4,c);
    pru.Insertar(1,d);
    pru.Insertar(2,e);
    pru.Insertar(5,b);
    pru.Insertar(0,a);
    pru.Insertar(3,c);
    pru.Insertar(9,e);
    pru.Insertar(8,a);
    pru.Insertar(10,e);
    QMessageBox Mensaj;
    Mensaj.setText(pru.Inorden());
    Mensaj.setWindowTitle("!");
    Mensaj.exec();
    cout<<1;
   IFS::SavePartes(&pru);
}

void MainWindow::on_pushButton_12_clicked()
{
    ui->imag1->setGeometry(ui->imag1->x()+10,ui->imag1->y()+10,ui->imag1->width(),ui->imag1->height());
}

void MainWindow::on_pushButton_13_clicked()
{
    AB<B> pru;
    QMessageBox Mensaj;
    Mensaj.setText(pru.Inorden());
    Mensaj.setWindowTitle("!");
    Mensaj.exec();
    IFS::ReadPartes(&pru);
    Mensaj.setText(pru.Inorden());
    Mensaj.setWindowTitle("!");
    Mensaj.exec();

}

void MainWindow::on_pushButton_14_clicked()
{
    IFS::WriteLog("miau");
}

void MainWindow::on_Registar_P_clicked()
{


    QMessageBox Mensaj;
    ostringstream temp1;
    temp1<<ui->Hora_g->time().hour();
    std::string hora="";
    hora+=temp1.str()+":";
    ostringstream temp2;
    temp2<<ui->Hora_g->time().minute();
    hora+=temp2.str();
                                            //informacion para registrar un parte
    std::string Fecha="";
    ostringstream temp3;
    temp3<<ui->Fecha_g->date().day();
    Fecha += temp3.str()+"/";
    ostringstream temp4;
    temp4<<ui->Fecha_g->date().month();
    Fecha += temp4.str()+"/";
    ostringstream temp5;
    temp5<<ui->Fecha_g->date().year();
    Fecha += temp5.str()+"/";

    std::string nombre = "";   //nombre de la persona
    ostringstream temp6;
    temp6<<ui->Nombres_c;
    nombre += temp6.str();

    int cedula=ui->Cedula_g->value();

    //numero del parte
    int parte=ui->Parte_g->value();


    //monto a pagar
    int monto=ui->Monto_g->value();


    //numero de placa
    int placa=ui->Placa_g->value();

                                //para tomar la infor
    if(Clientes->Valido(cedula))
    {
        if(!Partes->Valido(parte))
        {
            if (Registros->Valido(placa))
            {
                B str;
                str.fecha=Fecha;
                str.hora=hora;
                str.Monto=monto;
                str.Placa=placa;
                Partes->Insertar(parte,str);
                IFS::SavePartes(Partes);
                if(!Indice->Valido(cedula))
                {
                    Indice->InsertarFinal(cedula,new Lista<unsigned int>());
                }
                Indice->Index(cedula)->InsertarFinal(parte,1);
                Mensaj.setText("Exitoso");
                Mensaj.setWindowTitle("!");
                Mensaj.exec();

            }
            else
            {
                Mensaj.setText("Placa no valida");
                Mensaj.setWindowTitle("!");
                Mensaj.exec();
            }
        }
        else
        {
            Mensaj.setText("Parte repetido");    //no esta pasando por esta linea
            Mensaj.setWindowTitle("!");
            Mensaj.exec();
        }
    }
    else
    {
        Mensaj.setText("Cliente no valido");
        Mensaj.setWindowTitle("!");
        Mensaj.exec();
    }
}

void MainWindow::on_Registrar_C_clicked()
{
    QMessageBox Mensaj;
    int ced=ui->Cedula_cg->value();
    int lic=ui->Licencia_g->value();
    int placa=ui->placa_cg->value();
    if(cant<9)
    {
        if(Clientes->Valido(ced))
        {
            if(Indice->Valido(ced))
            {
                if (Registros->Valido(placa))
                {
                    if(Tarjetas->Valido(ced))
                    {
                        if(Clientes->Index(ced).Licencia==lic && Registros->Index(placa).Licencia==lic)
                        {
                            Personas.Agregar(new Persona(Clientes->Index(ced).Nombre,ced,lic,placa,Registros->Index(placa).Modelo, cant+1));


                            Lista<unsigned int>* temp =Indice->Index(ced);
                            //int a = temp->Largo();
                            for (int i=1; i<=temp->Largo(); i++)
                            {
                                Nodo<unsigned int>* aux = (*temp)[i];
                                //int b = aux->getValor();
                                Personas.byID(cant+1)->getfx()->AddParte(aux->getValor(),Partes->Index(aux->getValor()).Monto);
                            }
                            Personas.byID(cant+1)->getfx()->ReporteTxt();
                            Indice->EliminarID(ced);

                            switch(cant)
                            {
                            case 0:
                                ui->C1->setVisible(true);
                                break;
                            case 1:
                                ui->C2->setVisible(true);
                                break;
                            case 2:
                                ui->C3->setVisible(true);
                                break;
                            case 3:
                                ui->C4->setVisible(true);
                                break;
                            case 4:
                                ui->C5->setVisible(true);
                                break;
                            case 5:
                                ui->C6->setVisible(true);
                                break;
                            case 6:
                                ui->C7->setVisible(true);
                                break;
                            case 7:
                                ui->C8->setVisible(true);
                                break;
                            case 8:
                                ui->C9->setVisible(true);
                                break;
                            default:
                                break;
                            }

                            cant++;
                            ui->progressBar->setValue(cant*100/9);
                            Mensaj.setText("Cliente insertado");
                            Mensaj.setWindowTitle("!");
                            Mensaj.exec();
                        }
                        else
                        {
                            Mensaj.setText("Licencia invalida");
                            Mensaj.setWindowTitle("!");
                            Mensaj.exec();
                        }
                    }
                    else
                    {
                        Mensaj.setText("Sin Tarjetas");
                        Mensaj.setWindowTitle("!");
                        Mensaj.exec();
                    }
                }
                else
                {
                    Mensaj.setText("Placa no valida");
                    Mensaj.setWindowTitle("!");
                    Mensaj.exec();
                }
            }
            else
            {
                Mensaj.setText("Ud No posee partes");
                Mensaj.setWindowTitle("!");
                Mensaj.exec();
            }
        }
        else
        {
            Mensaj.setText("Cedula invalida");
            Mensaj.setWindowTitle("!");
            Mensaj.exec();
        }
    }
    else
    {
        Mensaj.setText("Cola Llena");
        Mensaj.setWindowTitle("!");
        Mensaj.exec();
    }
}

void MainWindow::on_pushButton_8_clicked()
{
    QMessageBox Mensaj;
    if (cant==9)
    {
        ff=false;
        ui->Clientes_c->setEnabled(false);
        ui->Partes_c->setEnabled(false);
        Personas.HeapSort();
        Th1->setTipo(Personas[proc]);
        Th1->start();
        proc++;
        Th2->setTipo(Personas[proc]);
        Th2->start();
        proc++;
        Th3->setTipo(Personas[proc]);
        Th3->start();
        proc++;
        ui->pushButton_8->setEnabled(false);

    }
    else
    {
        Mensaj.setText("Cola aun sin Llenar");
        Mensaj.setWindowTitle("!");
        Mensaj.exec();
    }

}

void MainWindow::on_pushButton_9_clicked()
{
    QMessageBox Mensaj;
    Mensaj.setText(Partes->Inorden());
    Mensaj.setWindowTitle("!");
    Mensaj.exec();
}

void MainWindow::ChImag(int id, int x, int y)
{
    switch (id)
    {
    case 1:
        ui->C1->setGeometry(x,y,ui->C1->width(),ui->C1->height());
        break;
    case 2:
        ui->C2->setGeometry(x,y,ui->C2->width(),ui->C2->height());
        break;
    case 3:
        ui->C3->setGeometry(x,y,ui->C3->width(),ui->C3->height());
        break;
    case 4:
        ui->C4->setGeometry(x,y,ui->C4->width(),ui->C4->height());
        break;
    case 5:
        ui->C5->setGeometry(x,y,ui->C5->width(),ui->C5->height());
        break;
    case 6:
        ui->C6->setGeometry(x,y,ui->C6->width(),ui->C6->height());
        break;
    case 7:
        ui->C7->setGeometry(x,y,ui->C7->width(),ui->C7->height());
        break;
    case 8:
        ui->C8->setGeometry(x,y,ui->C8->width(),ui->C8->height());
        break;
    case 9:
        ui->C9->setGeometry(x,y,ui->C9->width(),ui->C9->height());
        break;
    default:
        break;
    }
}
void MainWindow::ChNum(int id, int monto)
{
    switch (id)
    {
    case 1:
        ui->M1->display(monto);
        break;
    case 2:
        ui->M2->display(monto);
        break;
    case 3:
        ui->M3->display(monto);
        break;
    default:
        break;
    }
}
void MainWindow::ChNam(int id, QString nombre)
{
    switch (id)
    {
    case 1:
        ui->N1->setText(nombre);
        break;
    case 2:
        ui->N2->setText(nombre);
        break;
    case 3:
        ui->N3->setText(nombre);
        break;
    default:
        break;
    }
}
void MainWindow::ChTar(int id, QString nombre)
{
    switch (id)
    {
    case 1:
        ui->P1->display(nombre);
        break;
    case 2:
        ui->P2->display(nombre);
        break;
    case 3:
        ui->P3->display(nombre);
        break;
    default:
        break;
    }
}
void MainWindow::ImagDes(int id)
{
    int x=400;
    int y=400;

    switch (id)
    {
    case 1:
        ui->C1->setGeometry(x,y,ui->C1->width(),ui->C1->height());
        ui->C1->setVisible(false);
        break;
    case 2:
        ui->C2->setGeometry(x,y,ui->C2->width(),ui->C2->height());
        ui->C2->setVisible(false);
        break;
    case 3:
        ui->C3->setGeometry(x,y,ui->C3->width(),ui->C3->height());
        ui->C3->setVisible(false);
        break;
    case 4:
        ui->C4->setGeometry(x,y,ui->C4->width(),ui->C4->height());
        ui->C4->setVisible(false);
        break;
    case 5:
        ui->C5->setGeometry(x,y,ui->C5->width(),ui->C5->height());
        ui->C5->setVisible(false);
        break;
    case 6:
        ui->C6->setGeometry(x,y,ui->C6->width(),ui->C6->height());
        ui->C6->setVisible(false);
        break;
    case 7:
        ui->C7->setGeometry(x,y,ui->C7->width(),ui->C7->height());
        ui->C7->setVisible(false);
        break;
    case 8:
        ui->C8->setGeometry(x,y,ui->C8->width(),ui->C8->height());
        ui->C8->setVisible(false);
        break;
    case 9:
        ui->C9->setGeometry(x,y,ui->C9->width(),ui->C9->height());
        ui->C9->setVisible(false);
        break;
    default:
        break;
    }
}
void MainWindow::IFinit(int id)
{
    if(proc<9)
    {
        switch (id)
        {
        case 1:
            Th1->setYa(false);
            Th1->setTipo(Personas[proc]);
            Th1->start();
            proc++;
            break;
        case 2:
            Th2->setYa(false);
            Th2->setTipo(Personas[proc]);
            Th2->start();
            proc++;
            break;
        case 3:
            Th3->setYa(false);
            Th3->setTipo(Personas[proc]);
            Th3->start();
            proc++;
            break;
        default:
            break;
        }
    }
    else
    {
        if(!ff)
        {
            ff=true;
            //emit EFinit();
        }
    }
}
void MainWindow::EIFinit()
{
        heap nuevo;
        Personas=nuevo;
        cant=0;
        proc=0;

        Th1->setYa(false);
        Th2->setYa(false);
        Th3->setYa(false);

        ui->C1->setGeometry(20,10,ui->C1->width(),ui->C1->height());
        ui->C2->setGeometry(20,60,ui->C1->width(),ui->C1->height());
        ui->C3->setGeometry(20,110,ui->C1->width(),ui->C1->height());
        ui->C4->setGeometry(20,160,ui->C1->width(),ui->C1->height());
        ui->C5->setGeometry(20,210,ui->C1->width(),ui->C1->height());
        ui->C6->setGeometry(70,20,ui->C1->width(),ui->C1->height());
        ui->C7->setGeometry(70,70,ui->C1->width(),ui->C1->height());
        ui->C8->setGeometry(70,120,ui->C1->width(),ui->C1->height());
        ui->C9->setGeometry(70,170,ui->C1->width(),ui->C1->height());

        ui->progressBar->setValue(0);
        ui->Clientes_c->setEnabled(true);
        ui->Partes_c->setEnabled(true);
        ui->pushButton_8->setEnabled(true);


}

void MainWindow::on_P1_2_clicked()
{
    Th1->setYa(true);
}

void MainWindow::on_P2_2_clicked()
{
    Th2->setYa(true);
}

void MainWindow::on_P3_2_clicked()
{
    Th3->setYa(true);
}

void MainWindow::on_k_clicked()
{
    //ui->M1->display(rand());
    emit EFinit();
}

void MainWindow::on_pushButton_11_clicked()
{
    QMessageBox Mensaj;
    QString M="1) Para Registrar un parte complete los campos respectivos; en caso de que alguno de los campos no sea valido el sistema le indicara\n";
    M+="2) Para Registrar un cliente inserte la informacion el los campos respectivos, si hay error el sistema indicara\n";
    M+= "3) Cuando la cola este llena podra iniciar la simulacion";
    Mensaj.setText(M);
    Mensaj.setWindowTitle("Ayuda");
    Mensaj.exec();
}
